package com.vincent.exam.linkedList;

/**
 * 删除倒数第N个节点
 * 先计算链表长度
 * 然后使用长度减去倒数第N个找到需要删除的目标索引index
 * 然后找到需要删除的节点的前一个节点
 * 最后跳过需要删除的节点，即将下一个节点指向下下一个节点
 */
public class RemoveTargetNode {
    public ListNode removeNthFromEnd (ListNode head, int n) {
        // 链表长度
        int length = 0;
        ListNode temp = head;
        while(temp != null) {
            length++;
            temp = temp.next;
        }
        // 需要删除的节点目标索引
        int index = length - n;
        // 当前需要操作的节点
        ListNode cur = head;
        // 开始节点
        ListNode begin = cur;
        // 如果是第一个，直接返回第二个节点
        if(index == 0){
            return cur.next;
        }
        // 找到需要删除节点的前一个节点
        for(int i=0;i < index - 1;i++){
            cur = cur.next;
        }
        // 直接跳过next即达到了删除的目的
        cur.next = cur.next.next;
        return begin;
    }
}
